<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script src="./Stack_Queue.js"></script>
    <script>
        /**
         * 实现带有getMin方法的特殊栈。
         * 要求时间复杂度是O(1)
         * 
         * 思路1：
         *      准备两个栈 主栈和次栈
         *      每次栈push数据的时候。
         *      栈更新最小值，当且仅当当前值的最小值比栈里的最小值小时，次栈才更新
         *      弹出时 主栈的值小于等于次栈时才弹出次栈
         * 思路2：
         *      同步弹出，
         *      则要求同步记录，主栈每进入一个数，次栈就要将当前的最小值更新
         *      长度与主栈保持等高
         */ 
        function getMinStack(){
            let stackData = new Stack();
            let stackMin = new Stack();

            this.push = function(value){
                stackData.push(value)
                if(stackMin.empty()){
                    stackMin.push(value)
                }else if(value<=this.getMin()){
                    stackMin.push(value)
                }
                console.log(stackData)
            }

            this.getMin = function(){
                if(stackMin.empty()){
                    throw new Error('栈为空')
                }
                return stackMin.peek();
            }

            // 弹出==》 即弹出栈元素的同时更新值
            this.pop = function(){
                if(stackData.empty()){
                    throw new Error('栈为空')
                }
                let value = stackData.pop();
                if(value == this.getMin()){
                    stackMin.pop()
                }
                return value;
            }

        }
        let arr = new getMinStack();
    
        let arr1 = [1,23,3,4,-2];
        arr1.map(item=>{
            arr.push(item);
        })
        console.log(arr.getMin());//-2
    </script>
</body>
</html>